package cn.iocoder.yudao.module.system.service.examcontrolline;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.examcontrolline.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.examcontrolline.ExamControlLineDO;
import cn.iocoder.yudao.module.system.dal.dataobject.examscoreconversion.ExamScoreConversionDO;

import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;

/**
 * 特控线配置 Service 接口
 *
 * @author 芋道源码
 */
public interface ExamControlLineService {

    /**
     * 创建特控线配置
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createExamControlLine(@Valid ExamControlLineCreateReqVO createReqVO);

    /**
     * 更新特控线配置
     *
     * @param updateReqVO 更新信息
     */
    void updateExamControlLine(@Valid ExamControlLineUpdateReqVO updateReqVO);

    /**
     * 删除特控线配置
     *
     * @param id 编号
     */
    void deleteExamControlLine(Long id);

    /**
     * 获得特控线配置
     *
     * @param id 编号
     * @return 特控线配置
     */
    ExamControlLineDO getExamControlLine(Long id);

    /**
     * 获得特控线配置列表
     *
     * @param ids 编号
     * @return 特控线配置列表
     */
    List<ExamControlLineDO> getExamControlLineList(Collection<Long> ids);

    /**
     * 获得特控线配置分页
     *
     * @param pageReqVO 分页查询
     * @return 特控线配置分页
     */
    PageResult<ExamControlLineDO> getExamControlLinePage(ExamControlLinePageReqVO pageReqVO);

    /**
     * 获得特控线配置列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 特控线配置列表
     */
    List<ExamControlLineDO> getExamControlLineList(ExamControlLinePageReqVO exportReqVO);

    /**
     * 根据考试ID获取特控线列表
     *
     * @param examId 考试ID
     * @return 特控线列表
     */
    List<ExamControlLineDO> getExamControlLineListByExamId(Long examId);

    /**
     * 成绩换算
     *
     * @param examId 考试ID
     * @param studentId 学生ID
     * @param originalScore 原始成绩
     * @param controlLineId 特控线ID
     * @return 换算结果
     */
    ExamScoreConversionRespVO convertScore(Long examId, Long studentId, BigDecimal originalScore, Long controlLineId);

    /**
     * 批量成绩换算
     *
     * @param examId 考试ID
     * @param controlLineId 特控线ID
     * @return 换算结果列表
     */
    List<ExamScoreConversionRespVO> batchConvertScore(Long examId, Long controlLineId);

    /**
     * 获取学生的换算记录
     *
     * @param studentId 学生ID
     * @return 换算记录列表
     */
    List<ExamScoreConversionDO> getConversionRecordsByStudentId(Long studentId);

    /**
     * 获取院校推荐
     *
     * @param convertedScore 换算后成绩
     * @param estimatedRank 预估位次
     * @param province 省份
     * @return 推荐院校列表
     */
    List<CollegeRecommendationRespVO> getCollegeRecommendations(BigDecimal convertedScore, Integer estimatedRank, String province);

    /**
     * 获取专业推荐
     *
     * @param convertedScore 换算后成绩
     * @param estimatedRank 预估位次
     * @param province 省份
     * @param subjectCombination 选科组合
     * @return 推荐专业列表
     */
    List<MajorRecommendationRespVO> getMajorRecommendations(BigDecimal convertedScore, Integer estimatedRank, String province, String subjectCombination);

    /**
     * 生成学生报考建议
     *
     * @param studentId 学生ID
     * @param examId 考试ID
     * @return 报考建议
     */
    StudentAdmissionAdviceRespVO generateAdmissionAdvice(Long studentId, Long examId);

}